import pygame
from pygame import DOUBLEBUF
from pygame.time import delay

from dissipate.sounds import play_sound, Sounds  # 导入声音播放功能和声音资源
from dissipate.sprites import Tree  # 导入关卡树的类


class LevelTreeManager:
    """
    关卡树管理器类，用于管理关卡树及其相关功能。
    """
    __screen_size = (900, 600)  # 屏幕尺寸
    screen = pygame.display.set_mode(__screen_size, DOUBLEBUF, 32)  # 设置屏幕显示模式
    fruit_list = []  # 用于存储水果对象的列表
    fruit_image = pygame.image.load(Tree.fruit).convert_alpha()  # 加载水果图片
    fruit_width = fruit_image.get_width()  # 获取水果图片宽度
    fruit_height = fruit_image.get_height()  # 获取水果图片高度
    type = 0  # 场景类型，0 表示关卡树场景，1 表示能量场景
    energy_full = False  # 能量已满标志
    money_empty = False  # 金钱不足标志

    def display_text(self, text, position, txt_size=25, txt_color=(255, 255, 255)):
        """
        显示指定的文本内容。
        参数：
        text: 要显示的文本
        position: 文本位置
        txt_size: 文本大小
        txt_color: 文本颜色
        """
        my_font = pygame.font.SysFont(None, txt_size)  # 创建字体对象
        text_screen = my_font.render(text, True, txt_color)  # 渲染文本
        self.screen.blit(text_screen, position)  # 在屏幕上绘制文本

    def draw_tree(self, energy_num, money_num):
        """
        绘制游戏中的关卡树和相关资源。
        参数：
        energy_num: 当前能量值
        money_num: 当前金钱数量
        """
        Tree(Tree.tree, (0, 600)).draw(self.screen)  # 绘制关卡树
        Tree(Tree.energy_num, Tree.energy_num_position).draw(self.screen)  # 绘制能量数
        if energy_num > 30:
            self.display_text(str(30) + '/30', (22, 55), 21)  # 显示最大能量值
        else:
            self.display_text(str(energy_num) + '/30', (22, 55), 21)  # 显示当前能量值
        Tree(Tree.money, (15, 135)).draw(self.screen)  # 绘制金钱
        self.display_text(str(money_num), (32, 124), 21)  # 显示当前金钱数量
        for i in range(0, 10):  # 绘制水果
            Tree(Tree.fruit, Tree.position[i]).draw(self.screen)
            self.display_text(str(i + 1), (Tree.position[i][0] + 15, Tree.position[i][1] - 47))
        if self.type == 1:
            Tree(Tree.energy_buy, Tree.energy_buy_position).draw(self.screen)  # 绘制购买能量按钮
            if self.energy_full:
                self.display_text('energy is full!', (430, 310), 30, (255, 0, 0))  # 显示能量已满提示
                pygame.display.flip()  # 更新屏幕显示
                delay(500)  # 延迟500毫秒
                self.energy_full = False  # 重置能量已满标志
            if self.money_empty:
                self.display_text('money is not enough!', (410, 310), 30, (255, 0, 0))  # 显示金钱不足提示
                pygame.display.flip()  # 更新屏幕显示
                delay(500)  # 延迟500毫秒
                self.money_empty = False  # 重置金钱不足标志

    def mouse_select(self, mgr, mouse_x, mouse_y, level, energy_num, money_num):
        """
        处理鼠标事件。
        参数：
        mgr: 管理器对象
        mouse_x: 鼠标x坐标
        mouse_y: 鼠标y坐标
        level: 当前等级
        energy_num: 当前能量值
        money_num: 当前金钱数量
        """
        if self.type == 0:  # 关卡树场景
            for i in range(0, 10):
                if Tree.position[i][0] < mouse_x < Tree.position[i][0] + self.fruit_width \
                        and Tree.position[i][1] - self.fruit_height < mouse_y < Tree.position[i][1]:
                    if energy_num <= 0:
                        self.type = 1  # 切换到能量场景
                    else:
                        level = i + 1  # 更新等级
            if Tree.energy_num_position[0] < mouse_x < Tree.energy_num_position[0] + 60 \
                    and Tree.energy_num_position[1] - 60 < mouse_y < Tree.energy_num_position[1]:  # 点击能量图标
                play_sound(Sounds.CLICK)  # 播放点击音效
                self.type = 1  # 切换到能量场景
        else:  # 能量场景
            if 408 < mouse_x < 600 and 263 < mouse_y < 313:  # 点击“购买能量”按钮
                play_sound(Sounds.CLICK_BUTTON)  # 播放点击按钮音效
                if money_num < 50:
                    self.money_empty = True  # 金钱不足标志设为真
                if energy_num >= 30:
                    self.energy_full = True  # 能量已满标志设为真
                elif energy_num < 30 and money_num >= 50:
                    energy_num += 5  # 增加能量
                    money_num -= 50  # 减少金钱
            elif 619 < mouse_x < 638 and 158 < mouse_y < 177:  # 点击“X”按钮
                self.type = 0  # 切换回关卡树场景
        mgr.level, mgr.energy_num, mgr.money = level, energy_num, money_num  # 更新管理器对象中的等级、能量和金钱信息
